Wang Haihua
🍈 🍉🍊 🍋 🍌
感知器是由美国人 Rosenblatt 于 1957 年提出的, 它是最早的人工神 经网络。单层感知器是一个具有一层神经元、采用阈值激活函数的前向网络 通过对网络权值的训练, 可以使感知器对一组输入矢量的响应达到 0 或 1 的目标输出, 从而实现对输入矢量的分类。图 $17.3$ 是单层感知器神经元模 型, 其中 $m$ 为输入神经元的个数。 $$ v=\sum_{i=1}^{m} w_{i} x_{i}+b, \quad y= \begin{cases}1, & v \geq 0, \\ 0, & v<0 .\end{cases} $$
感知器可以利用其学习规则来调整网络的权值, 以便使网络对输入矢 量的响应达到 0 或 1 的目标输出。 感知器的设计是通过监督式的权值训练来完成的, 所以网络的学习过 程需要输入和输出样本对。实际上, 感知器的样本对是一组能够代表所要分 类的所有数据划分模式的判定边界。这些用来训练网络权值的样本是靠设 计者来选择的, 所以要特别进行选取以便获得正确的样本对。 感知器的学习规则使用梯度下降法, 可以证明, 如果解存在, 则算法在 有限次的循环迭代后可以收敛到正确的目标矢量。
例 采用单一感知器神经元解决简单的分类问题:将四个输入矢 量分为两类, 其中两个矢量对应的目标值为 1, 另外两个矢量对应的目标值 为 0 , 即输入矢量 $$ P=\left[\begin{array}{cccc} -0.5 & -0.5 & 0.3 & 0.0 \\ -0.5 & 0.5 & -0.5 & 1.0 \end{array}\right] \text {, } $$ 其中, 每一列是一个输入的取值, 且目标分类矢量 $T=[1,1,0,0]$ 。试预测新 输入矢量 $\boldsymbol{p}=[-\mathbf{0 . 5}, 0.2]^{T}$ 的目标值。
记两个指标变量分别为 $x_{1}, x_{2}$, 求得的分类函数为 $v=-1.3 x_{1}-0.5 x_{2}$ 。新 输入矢量 $p$ 的目标值为 1。
BP神经网络是一种神经网络学习算法,由输入层、中间层和输出层组成,中间层可扩展为多层。相邻层之间各神经元进行全连接,而每层各神经元之间无连接,网络按有监督方式进行学习,当一对学习模式提供网络后,各神经元获得网络的输入响应产生连接权值。然后按减少希望输出与实际输出的误差的方向,从输出层经各中间层逐层修正各连接权值,回到输入层。此过程反复交替进行,直至网络的全局误差趋向给定的极小值,即完成学习过程。三层BP神经网络结构如图所示。
BP神经网络最大优点是具有极强的非线性映射能力,它主要用于以下四个方面。 (1)函数逼近。用输入向量和相应的输出向量训练一个网络以逼近某个函数。 (2)模式识别。 (3)预测。 (4)数据压缩。减少输出向量维数以便传输或存储。
理论上,对于一个三层或三层以上的BP网络,只要隐层神经元数目足够多,该网络就能以任意精度逼近一个非线性函数。BP神经网络同时具有对外界刺激和输入信息进行联想记忆能力,这种能力使其在图像复原、语言处理、模式识别等方面具有重要作用。BP神经网络对外界输入样本有很强的识别与分类能力,解决了神经网络发展史上的非线性分类难题。BP神经网络还具有优化计算能力,其本质上是一个非线性优化问题,它可以在已知约束条件下,寻找参数组合,使该组合确定的目标函数达到最小。
图中, $x_{1}, x_{2}, \cdots, x_{n}$ 是神经网络输入值, $y_{1}, y_{2}, \cdots, y_{m}$ 是神经网络预 测值, $w_{i j}$ 为神经网络的权值。BP 神经网络具体流程如下:
第一步:初始化, 给各连接权 $w_{i j}$ 及阈值 $\theta_{i j}$ 赋予 $[-1,1]$ 的随机值。
第二步: 随机选择一模式对 $X_{0}=\left[x_{1}^{0}, x_{2}^{0}, \cdots, x_{n}^{0}\right], Y_{0}=\left[y_{1}^{0}, y_{2}^{0}, \cdots, y_{m}^{0}\right]$ 提供 给网络。
第三步:用输入模式 $X_{0} 、$ 连接权 $w_{i j}$ 和阈值 $\theta_{i j}$ 计算中间层各单元的输入 $s_{j}$, 然后用 $s_{j}$ 通过 $\mathrm{S}$ 形函数计算中间层各单元的输出 $b_{j}$ 。
第四步: 用中间层的输出 $b_{j}$ 、连接权 $w_{i j}$ 和阈值 $\theta_{i j}$ 计算输出层各单元的输 $\lambda c_{j}$, 然后用 $c_{j}$ 通过 $\mathrm{S}$ 形函数计算输出层各单元的响应 $d_{j}$ 。
第五步: 用希望输出模式 $Y 、$ 网络实际输出 $d_{j}$, 计算输出层各单元一般 化误差 $e_{j}$ 。
第六步: 用连接权 $w_{i j}$ 、输出层一般化误差 $e_{j}$ 、中间层输出 $b_{j}$, 计算中间 层各单元一般化误差 $f_{j}$ 。
第七步: 用输出层各单元一般化误差 $e_{j}$ 、中间层各单元输出 $b_{j}$ 修正连接 权 $w_{i j}$ 和阈值 $\theta_{i j}$ 。
第八步:用中间层各单元一般化误差 $f_{j} 、$ 输入层各单元输入 $X_{0}$ 修正连 接权 $w_{i j}$ 和阈值 $\theta_{i j}$ 。
第九步:随机选择下一个学习模式对, 返回到第三步, 直至全部 $m$ 个模 式对训练完毕。 第十步:重新从 $m$ 个学习模式对中随机选取一个模式对, 返回第三步, 直至网络全局误差函数 $E$ 小于预先设定的一个极小值, 即网络收敛; 或学习 次数大于预先设定的值, 即网络无法收敛。第九步:随机选择下一个学习模式对, 返回到第三步, 直至全部 $m$ 个模 式对训练完毕。 第十步:重新从 $m$ 个学习模式对中随机选取一个模式对, 返回第三步, 直至网络全局误差函数 $E$ 小于预先设定的一个极小值, 即网络收敛; 或学习 次数大于预先设定的值, 即网络无法收敛。
(1) RBF 网络结构
RBF 神经网络有很强的逼近能力、分类能力和很快的学习速度。其工作 原理是把网络看成对末知函数的逼近,任何函数都可以表示成一组基函数 的加权和, 也即选择各隐层神经元的传输函数, 使之构成一组基函数来逼近 末知函数。RBF 人工神经网络由一个输入层、一个隐层和一个输出层组成。 RBF 神经网络的隐层基函数有多种形式, 常用函数为高斯函数, 设输入层的 输入为 $X=\left[x_{1}, x_{2}, \cdots, x_{n}\right]$, 实际输出为 $Y=\left[y_{1}, y_{2}, \cdots, y_{p}\right]$ 。
输入层实现从 $X \rightarrow R_{i}(X)$ 的非线性映射, 输出层实现从 $R_{i}(X) \rightarrow y_{k}$ 的 线性映射, 输出层第 $k$ 个神经元网络输出为 $$ \hat{y}_{k}=\sum_{i=1}^{m} w_{i k} R_{i}(X), \quad k=1,2, \cdots, p $$ 式中, $n$ 为输入层节点数; $m$ 为隐层节点数; $p$ 为输出层节点数; $w_{i k}$ 为隐层 第 $i$ 个神经元与输出层第 $k$ 个神经元的连接权值; $R_{i}(X)$ 为隐含层第 $i$ 个神经 元的作用函数, 如下式所示 $$ R_{i}(X)=\exp \left(-\left\|X-C_{i}\right\|^{2} / 2 \sigma_{i}^{2}\right), \quad i=1,2, \cdots, m, $$
式中, $X$ 为 $n$ 维输入向量; $C_{i}$ 为第 $i$ 个基函数的中心, 与 $X$ 具有相同维数的向 量, $\sigma_{i}$ 为第 $i$ 个基函数的宽度, $m$ 为感知单元的个数 (隐含层节点数)。 $\left\|X-C_{i}\right\|$ 为向量 $X-C_{i}$ 的范数, 它通常表示 $X$ 与 $C_{i}$ 之间的距离; $R_{i}(X)$ 在 $C_{i}$ 处有一个 唯一的最大值, 随着 $\left\|X-C_{i}\right\|$ 的增大, $R_{i}(X)$ 迅速衰减到零。对于给定的输入, 只有一小部分靠近 $X$ 的中心被激活。当确定了 RBF 网络的聚类中心 $C_{i}$ 、权 值 $w_{i k}$ 及 $\sigma_{i}$ 以后, 就可求出给定某一输入时, 网络对应的输出值。
(2) RBF 网络学习算法
在 RBF 网络中, 隐层执行的是一种固定不变的非线性变换, $C_{i}, \sigma_{i}, w_{i k}$ 需通过学习和训练来确定, 一般分为 3 步进行。
第二步: 确定基函数的宽度 $\sigma_{i}$ 。基函数中心 $C_{i}$ 训练完成后,可以求得归 一化参数, 即基函数的宽度 $\sigma_{i}$, 表示与每个中心相联系的子样本集中样本散 布的一个测度。常用的是令其等于基函数中心与子样本集中样本模式之间的平均距离。
第三步: 确定从隐含层到输出层的连接权值 $w_{i k}, \mathrm{RBF}$ 连接权 $w_{i k}$ 的修正 可以采用最小均方差误差测度准则进行。
参考文献
from sklearn.linear_model import Perceptron
import numpy as np
x0=np.array([[-0.5,-0.5,0.3,0.0],[-0.5,0.5,-0.5,1.0]]).T
y0=np.array([1,1,0,0])
md = Perceptron(tol=1e-3) #构造模型
md.fit(x0, y0) #拟合模型
print(md.coef_,md.intercept_) #输出系数和常数项
print(md.score(x0,y0)) #模型检验
print("预测值为:",md.predict(np.array([[-0.5,0.2]])))
[[-1.3 -0.5]] [0.] 1.0 预测值为: [1]